package com.kexio.user.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kexio.user.entity.UserRole;

import java.util.List;

/**
 * 用户角色关联Mapper接口
 * 
 * @author kexio
 * @since 1.0.0
 */
@Mapper
public interface UserRoleMapper extends BaseMapper<UserRole> {
    
    // 通用方法（MP Wrapper 实现），供 Service 调用
    default long countByRoleIdAndTenant(String roleId) {
        LambdaQueryWrapper<UserRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserRole::getRoleId, roleId);
        return this.selectCount(wrapper);
    }
    
    default long countByUserIdAndTenant(String userId) {
        LambdaQueryWrapper<UserRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserRole::getUserId, userId);
        return this.selectCount(wrapper);
    }
    
    default boolean existsByUserIdAndRoleId(String userId, String roleId) {
        LambdaQueryWrapper<UserRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserRole::getUserId, userId)
               .eq(UserRole::getRoleId, roleId);
        return this.selectCount(wrapper) > 0;
    }
    
    boolean existsUserRole(@Param("userId") String userId, @Param("roleCode") String roleCode);

    // XML 中的批量/同步操作声明
    
    /**
     * 为用户批量分配角色
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @param createdBy 创建者ID
     */
    void batchAssignRoles(@Param("userId") String userId, 
                          @Param("roleIds") List<String> roleIds, 
                          @Param("createdBy") String createdBy);
    
    /**
     * 为角色批量分配用户
     * @param roleId 角色ID
     * @param userIds 用户ID列表
     * @param createdBy 创建者ID
     */
    void batchAssignUsers(@Param("roleId") String roleId, 
                          @Param("userIds") List<String> userIds, 
                          @Param("createdBy") String createdBy);
    
    /**
     * 批量删除角色的指定用户关联
     * @param roleId 角色ID
     * @param userIds 用户ID列表
     */
    void batchDeleteByRoleAndUsers(@Param("roleId") String roleId, 
                                    @Param("userIds") List<String> userIds);
    
    /**
     * 同步角色的用户关联
     * @param roleId 角色ID
     * @param userIds 用户ID列表
     * @param createdBy 创建者ID
     */
    void syncRoleUsers(@Param("roleId") String roleId, 
                       @Param("userIds") List<String> userIds, 
                       @Param("createdBy") String createdBy);
}